/**
 * 开发者   : Marco
 * 创建时间 : 2016年9月1日, 下午5:57
 */


#include "base.h"

#include <stdlib.h>
#include <string.h>

namespace marco {
namespace node {

/**
 * 构造方式一
 * @param name 名称
 * @param id  ID
 * @param index 值
 */
base::base(const char* name, unsigned int id, int index) throw () : id_(id), val_(index), name_(NULL) {
    set_string(name_, name);
}

/**
 * 构造方式二
 * @param name 名称
 * @param id ID
 */
base::base(const char* name, unsigned int id) throw () : id_(id), val_(-1), name_(NULL) {
    set_string(name_, name);
}

/**
 * 拷贝构造
 */
base::base(const base& orig) throw () : id_(orig.id_), val_(orig.val_), name_(NULL) {
    set_string(name_, orig.name_);
}

/**
 * 赋值运算符重载
 */
base& base::operator=(const base& orig) throw ()  {
    if (this == &orig) return *this; // 防止自赋值
    id_ = orig.id_;
    val_ = orig.val_;
    if (name_) { // 释放原资源
	free(name_);
	name_ = NULL; // 下面set_string要判断原来是否NULL
    }
    set_string(name_, orig.name_);
    return *this;
}

#if (__cplusplus >= 201103L)
/**
 * 移动构造
 */
base::base(base&& orig) throw () : id_(orig.id_), val_(orig.val_), name_(orig.name_) {
    orig.name_ = nullptr;
}

/**
 * 移动赋值运算符重载
 */
base& base::operator=(base&& orig) throw ()  {
    if (this == &orig) return *this; // 防止自赋值
    id_ = orig.id_;
    val_ = orig.val_;
    if (name_) free(name_);  // 释放原资源
    name_ = orig.name_;
    orig.name_ = nullptr;
    return *this;
}

#endif

base::~base(void) {
    if (name_) free(name_);
}

/**
 * 更新字符串指针信息, 新内容如果是空指针或空串, 则释放原指针, 由调用方保证并发锁
 * @param oldPoint 原指针引用
 * @param newInfo 新指针信息
 */
void base::set_string(char*& old_ptr, const char* string) throw () {
    int len;
    
    if (!string || !(len = strlen(string))) { // 空指针或空串
	if (old_ptr) { free(old_ptr); old_ptr = NULL; } // // 原来非空则释放.
    } else { 
	old_ptr = (char *)realloc(old_ptr, len+1); strcpy(old_ptr, string); // 无论原来是否空, 用realloc不会错
    } 
}

} // namespace node
} // namespace marco